#ifndef LCD_DISPLAY_H
#define LCD_DISPLAY_H

#include "display.h"

#include <esp_lcd_panel_io.h>
#include <esp_lcd_panel_ops.h>
#include <font_emoji.h>

#include <atomic>

/**
 * @brief LCD显示器基类，继承自Display基类
 * 
 * 用于管理和控制LCD显示屏的显示内容和UI布局
 */
class LcdDisplay : public Display {
protected:
    esp_lcd_panel_io_handle_t panel_io_ = nullptr;  // LCD面板IO句柄
    esp_lcd_panel_handle_t panel_ = nullptr;        // LCD面板操作句柄
    
    lv_draw_buf_t draw_buf_;           // LVGL绘图缓冲区
    lv_obj_t* status_bar_ = nullptr;   // 状态栏UI对象
    lv_obj_t* content_ = nullptr;      // 主内容区UI对象
    lv_obj_t* container_ = nullptr;    // 容器UI对象
    lv_obj_t* side_bar_ = nullptr;     // 侧边栏UI对象

    DisplayFonts fonts_;               // 显示字体配置

    /**
     * @brief 设置UI布局
     */
    void SetupUI();
    
    /**
     * @brief 获取显示锁，确保UI操作的线程安全
     * @param timeout_ms 超时时间(毫秒)，0表示永不超时
     * @return 是否成功获取锁
     */
    virtual bool Lock(int timeout_ms = 0) override;
    
    /**
     * @brief 释放显示锁
     */
    virtual void Unlock() override;

protected:
    /**
     * @brief 受保护的构造函数，供子类调用
     * @param panel_io LCD面板IO句柄
     * @param panel LCD面板操作句柄
     * @param fonts 显示字体配置
     */
    LcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, DisplayFonts fonts)
        : panel_io_(panel_io), panel_(panel), fonts_(fonts) {}
    
public:
    /**
     * @brief 析构函数，释放资源
     */
    ~LcdDisplay();
    
    /**
     * @brief 设置表情状态
     * @param emotion 表情字符串
     */
    virtual void SetEmotion(const char* emotion) override;
    
    /**
     * @brief 设置图标
     * @param icon 图标字符串
     */
    virtual void SetIcon(const char* icon) override;
    
#if CONFIG_USE_WECHAT_MESSAGE_STYLE
    /**
     * @brief 设置聊天消息内容（微信风格）
     * @param role 消息角色(用户/助手/系统)
     * @param content 消息内容
     */
    virtual void SetChatMessage(const char* role, const char* content) override; 
#endif  

    /**
     * @brief 设置显示主题
     * @param theme_name 主题名称
     */
    virtual void SetTheme(const std::string& theme_name) override;
};

/**
 * @brief RGB LCD显示器类
 */
class RgbLcdDisplay : public LcdDisplay {
public:
    /**
     * @brief 构造函数
     * @param panel_io LCD面板IO句柄
     * @param panel LCD面板操作句柄
     * @param width 屏幕宽度
     * @param height 屏幕高度
     * @param offset_x X轴偏移量
     * @param offset_y Y轴偏移量
     * @param mirror_x 是否水平镜像
     * @param mirror_y 是否垂直镜像
     * @param swap_xy 是否交换XY坐标
     * @param fonts 显示字体配置
     */
    RgbLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel,
                  int width, int height, int offset_x, int offset_y,
                  bool mirror_x, bool mirror_y, bool swap_xy,
                  DisplayFonts fonts);
};

/**
 * @brief MIPI LCD显示器类
 */
class MipiLcdDisplay : public LcdDisplay {
public:
    /**
     * @brief 构造函数
     * @param panel_io LCD面板IO句柄
     * @param panel LCD面板操作句柄
     * @param width 屏幕宽度
     * @param height 屏幕高度
     * @param offset_x X轴偏移量
     * @param offset_y Y轴偏移量
     * @param mirror_x 是否水平镜像
     * @param mirror_y 是否垂直镜像
     * @param swap_xy 是否交换XY坐标
     * @param fonts 显示字体配置
     */
    MipiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel,
                   int width, int height, int offset_x, int offset_y,
                   bool mirror_x, bool mirror_y, bool swap_xy,
                   DisplayFonts fonts);
};

/**
 * @brief SPI LCD显示器类
 */
class SpiLcdDisplay : public LcdDisplay {
public:
    /**
     * @brief 构造函数
     * @param panel_io LCD面板IO句柄
     * @param panel LCD面板操作句柄
     * @param width 屏幕宽度
     * @param height 屏幕高度
     * @param offset_x X轴偏移量
     * @param offset_y Y轴偏移量
     * @param mirror_x 是否水平镜像
     * @param mirror_y 是否垂直镜像
     * @param swap_xy 是否交换XY坐标
     * @param fonts 显示字体配置
     */
    SpiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel,
                  int width, int height, int offset_x, int offset_y,
                  bool mirror_x, bool mirror_y, bool swap_xy,
                  DisplayFonts fonts);
};

/**
 * @brief QSPI LCD显示器类
 */
class QspiLcdDisplay : public LcdDisplay {
public:
    /**
     * @brief 构造函数
     * @param panel_io LCD面板IO句柄
     * @param panel LCD面板操作句柄
     * @param width 屏幕宽度
     * @param height 屏幕高度
     * @param offset_x X轴偏移量
     * @param offset_y Y轴偏移量
     * @param mirror_x 是否水平镜像
     * @param mirror_y 是否垂直镜像
     * @param swap_xy 是否交换XY坐标
     * @param fonts 显示字体配置
     */
    QspiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel,
                   int width, int height, int offset_x, int offset_y,
                   bool mirror_x, bool mirror_y, bool swap_xy,
                   DisplayFonts fonts);
};

/**
 * @brief MCU8080 LCD显示器类
 */
class Mcu8080LcdDisplay : public LcdDisplay {
public:
    /**
     * @brief 构造函数
     * @param panel_io LCD面板IO句柄
     * @param panel LCD面板操作句柄
     * @param width 屏幕宽度
     * @param height 屏幕高度
     * @param offset_x X轴偏移量
     * @param offset_y Y轴偏移量
     * @param mirror_x 是否水平镜像
     * @param mirror_y 是否垂直镜像
     * @param swap_xy 是否交换XY坐标
     * @param fonts 显示字体配置
     */
    Mcu8080LcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel,
                      int width, int height, int offset_x, int offset_y,
                      bool mirror_x, bool mirror_y, bool swap_xy,
                      DisplayFonts fonts);
};
#endif // LCD_DISPLAY_H
